package cn.Util.ByteQueue;

import cn.Util.Number.HexadecimalUtil;
import cn.domain.Sensor;
import cn.domain.Tunnel;

public class ByteQueueUtil {
	private ByteQueueUtil() {
	}

	/**
	 * 读取byte字符，并写入到Queue
	 * 
	 * @param byQueue
	 * @return
	 */
	public static Sensor ByteQueueToSensor(String byQueue) {
		String queue = byQueue.toString();
		String data[] = queue.split(",");
		Tunnel tunnel = null;
		Sensor sensor = new Sensor();
		int sernsorID = 0;
		boolean flag = false;
		// 去掉首位括号[]
		data[0] = data[0].replace("[", "");
		data[data.length - 1] = data[data.length - 1].replace("]", "");
		for (int i = 0; i < data.length; i++) {
			if (flag) {
				// 如果是从第三个字节开始读取，则跳过第四个字节
				flag = false;
				continue;
			}
			// Head device information 读取设备返回记录信息
			if (i < 3) {
				String deviceID = data[0];
				String functionCode = data[1];
				String byteCount = data[2];
				sensor.setDeviceId(Integer.parseInt(deviceID));
				// System.out.println("设备ID:" + deviceID + " 设备功能码:"+
				// functionCode + " 设备字节数:" + byteCount);
				i = 2;
				continue;
			}
			if (data[i].equals("0") || data[i].contains("]")) {

				// 数据读取完了。
				if (data[i - 1].equals("0") &&data[i + 1].equals("0")|| data[i].contains("]")) {
				    System.out.println("数据读入完成");
					break;
				}
				if(data[i-1].equals("ff")&&data[i].equals("0")){
					 System.out.println("空开关跳出完成");
					break;
				}
				// 如果是开关
				if (tunnel.isSswitch()) {
					// System.out.println("开关量状态"+data[i]);
					boolean onoff = data[i].equals("0") ? false : true;
					tunnel.setOnoff(onoff);
					// 下次是零，循环直接跳过.
					sensor.getTunnels().add(tunnel);
					flag = true;
					continue;
				} else {
					// 是前面有效数据中的零，可以直接跳过
					continue;
				}
			}
			if (i % 4 == 3) {
				tunnel = new Tunnel();
				tunnel.setDevicedID(sensor.getDeviceId()+"");
				sernsorID += 1;
				tunnel.setId(sernsorID);
				tunnel.setType(data[i]);
				// 如果是 a 或者 b 开头的，则需要提前设置一下开关
				if (data[i].contains("a") || data[i].contains("b")) {
					tunnel.setSswitch(true);
				}
			}
			if (i % 4 == 0) {
				// 如果是开关
				if (tunnel.isSswitch()) {
					data[i].equals("40");
					continue;
				}
				// 如果不是开关，则是个数值型的
				boolean symbol = (data[i].charAt(0)) == '8' ? true : false;
				int precision = 1;
				tunnel.setSymbol(symbol);
				// 如果 是81 代表有符号位的一位精确小数， 如果1 代表是精确到一位的无符号小数
				if (data[i].length() > 1) {
					precision = Integer.parseInt(String.valueOf(data[i]
							.charAt(1)));
				} else {
					precision = Integer.parseInt(String.valueOf(data[i]
							.charAt(0)));
				}
				precision = (int) Math.pow(10, precision);
				tunnel.setPrecision(precision);
			}
			if (i % 4 == 1) {
				// 如果是一个开关的话。
				if (tunnel.isSswitch()) {
					if (data[i].equals("0")) {
						tunnel.setOnoff(false);
					} else {
						tunnel.setOnoff(true);
					}
					flag = true;
					sensor.getTunnels().add(tunnel);
					continue;
				}
				// 说明在数字前两位不为0 ，这时候要把他和他后面的 字符相加组成16进制的数值
				String tunnelData = data[i] + data[i + 1];
				double tunnelNum = HexadecimalUtil
						.getNumberFromHexadecimal(tunnelData);
				tunnelNum = tunnelNum / tunnel.getPrecision();
				tunnel.setData(tunnelNum);
				// 如果这一次执行了。说面程序合并了双字节，把这一位 和后面的一位共同合并成了一个，故下次循环应该跳过一次
				flag = true;
				// System.out.println("1通道信息       id:"+tunnel.getId()+" 通道数据是否有符号:"+tunnel.isSymbol()+" 通道数据精度:"+tunnel.getPrecision()+" 获取到数据"+tunnel.getData());
				// 将节点加入到传感器中去
				sensor.getTunnels().add(tunnel);
			}
			if (i % 4 == 2) {
				// 说面数据第三位为0
				String tunnelData = data[i];
				double tunnelNum = HexadecimalUtil
						.getNumberFromHexadecimal(tunnelData);
				double precision = tunnel.getPrecision();
				tunnelNum = tunnelNum / precision;
				tunnel.setData(tunnelNum);
				// System.out.println("2通道信息       id:"+tunnel.getId()+" 通道数据是否有符号:"+tunnel.isSymbol()+" 通道数据精度:"+tunnel.getPrecision()+" 获取到数据"+tunnel.getData());
				// 将节点加入到传感器中去
				sensor.getTunnels().add(tunnel);
			}
		}
		return sensor;
	}
}
